package com.briup.day08;

/**
 * @author lining
 * @date 2024/1/17 11:28
 */
public class SuperClass2 {
    public void method(){
        System.out.println("father1");
    }
    public static void method2(){
        System.out.println("father2");
    }
    private void method3(){
        System.out.println("father3");
    }
    public static void main(String[] args) {
        SubClass2 s = new SubClass2();
        //子类继承父类，在调用方法的时候，如果子类中没用重写，那么调用
        //从父类继承的方法，如果子类重写了这个方法，那么调用到子类重写的方
        //法。（ 非常重要 ）
        s.method();//son
        s.method2();//son 静态方法不能重写， 输出结果由左边的类型决定
        s.method3();//son 私有方法不能重写 ，输出结果是左边的类型决定

        System.out.println("------------------");
        //编写代码表示多态(反对java是一强类型)
        //父类类型的引用 指向 子类类型对象
        //隐式转换  大类型 = 小类型  long a = 1;
        SuperClass2 father = new SubClass2();
        /*
              子类对象调用该方法。引用类型是父类型
              通过子类对象调用Method 被重写。重写后的逻辑
         */
        father.method();//son1
        //不是重写,输出结果中与等号左边SuperClass有关系
        father.method3();//father3  ，
        //不是重写，输出结果与等号左边类型SuperClass有关系
        father.method2();//father2
        /*
        结论： 如果是重写。编译看左边
                是否可以通过编译，由父类决定。
                父类引用是无法子类中私有方法
            运行看右边
                输出结果，由指向的具体的子类对象。重写后的逻辑输出。

            如果不是重写： 静态方法 私有方法
            编译和运行看左边

         */
//        father.method4(); 编译错误


    }
}
class SubClass2 extends SuperClass2{
    public void method(){
        System.out.println("son1");
    }
    public static void method2(){
        System.out.println("son2");
    }
    public void method3(){
        System.out.println("son3");
    }
    private void method4(){
        System.out.println("son4");
    }
}
